import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;

//Deque（双端队列，Double-Ended Queue）是java.util包中的一个接口
// ，它继承自Queue接口，表示一个可以在两端插入和删除元素的线性集合


//常用实现类
//ArrayDeque：基于数组实现的双端队列，性能较好，适用于大多数场景。
//LinkedList：基于链表实现的双端队列，同时实现了Deque和List接口。

//Queue 是 Java 中的一个接口，位于 java.util 包中，表示一个 队列数据结构，
//用于存储按照先进先出 (FIFO) 原则排列的元素。

public class Main {
    public static void main(String[] args) {
        Deque<Integer> deque=new LinkedList<>();

        //增加元素
        deque.addFirst(10);
        deque.addLast(20);
        deque.offerFirst(1);
        deque.offerLast(2);
        deque.offer(11);
        System.out.println(deque);

        //删除元素
        deque.removeFirst();
        deque.removeLast();
        deque.pollFirst();
        deque.pollLast();
        System.out.println(deque);

        //获取队首队尾
        deque.offer(12);
        System.out.println(deque.getFirst());
        System.out.println(deque.getLast());
        System.out.println(deque.peekFirst());
        System.out.println(deque.peekLast());

        //获取长度
        System.out.println(deque.size());

        //判空
        System.out.println(deque.isEmpty());

        // 正向遍历（从头到尾）
        Iterator<Integer> integers= deque.iterator();
        while(integers.hasNext()){
            System.out.print(integers.next()+" ");
        }

        System.out.println();

        //逆向遍历（从尾到头）
        Iterator<Integer> descendingIterator=deque.descendingIterator();
        while(descendingIterator.hasNext()){
            System.out.print(descendingIterator.next()+" ");
        }
        System.out.println();
    }

    public static void main1(String[] args) {
        //这两个的区别就在于Deque<Integer> deque = new ArrayDeque<>();较为灵活，绑定Deque接口,将来如果换一个实现类
        //比如LinkedList,也就不用修改相关的内容
        //而ArrayDeque<Integer> arrayDeque=new ArrayDeque<>();则是完全绑定了ArrayDeque实现类,将来换一个实现类的
        //话，要修改相关内容。
        //但是的话，ArrayDeque<Integer> arrayDeque=new ArrayDeque<>()可以实现ArrayDeque专有的方法,Deque<Integer> deque = new ArrayDeque<>()
        //只能实现在ArrayDeque中重写Deque的方法
        Deque<Integer> deque = new ArrayDeque<>();
//        ArrayDeque<Integer> arrayDeque=new ArrayDeque<>();

        // 添加元素
        deque.addFirst(10);
        deque.addLast(20);
        deque.offerFirst(5);
        deque.offerLast(25);

        System.out.println("Deque 内容: " + deque); // 输出: [5, 10, 20, 25]

        // 删除元素
        deque.removeFirst(); // 删除队首
        deque.pollLast();    // 删除队尾

        System.out.println("删除后的 Deque 内容: " + deque); // 输出: [10, 20]

        // 获取元素
        System.out.println("队首元素: " + deque.peekFirst()); // 输出: 10
        System.out.println("队尾元素: " + deque.peekLast());  // 输出: 20

    }
}
